home *** CD-ROM | disk | FTP | other *** search
/ Aminet 2 / Aminet AMIGA CDROM (1994)(Walnut Creek)[Feb 1994][W.O. 44790-1].iso / Aminet / mus / misc / PRC.lha / ProRunCrack / ProRunCrack.s < prev    next >
Encoding:
Text File  |  1993-02-12  |  26.7 KB  |  1,090 lines

  1. **********************************************************************
  2. **  program  : ProRunCrack                                          **
  3. **  version  : 1.0                                                  **
  4. **  author   : Gunther Nikl                                         **
  5. **  language : Devpac 2.14 (assembler)                              **
  6. **  bugs     : none known                                           **
  7. **********************************************************************
  8. **                                                                  **
  9. **    History                                                       **
  10. **    -------                                                       **
  11. ** v1.0 05-Mar-93  first version                                    **
  12. **                                                                  **
  13. **********************************************************************
  14.  
  15.         opt    o+,w-
  16.  
  17. _LVOForbid        equ    -132
  18. _LVOAllocMem        equ    -198
  19. _LVOFreeMem        equ    -210
  20. _LVOGetMsg        equ    -372
  21. _LVOReplyMsg        equ    -378
  22. _LVOWaitPort        equ    -384
  23. _LVOCloseLibrary    equ    -414
  24. _LVORawDoFmt        equ    -522
  25. _LVOOpenLibrary        equ    -552
  26.  
  27. _LVOOpen        equ    -30
  28. _LVOClose        equ    -36
  29. _LVORead        equ    -42
  30. _LVOWrite        equ    -48
  31. _LVOOutput        equ    -60
  32. _LVOSeek        equ    -66
  33. _LVODeleteFile        equ    -72
  34. _LVOCurrentDir        equ    -126
  35.  
  36. _LVOFileRequest        equ    -84
  37. _LVOPurgeFiles        equ    -114
  38.  
  39. ADDSTR        macro
  40.         dc.w    \1.str-StringTab
  41. \1        equ    StrCount
  42. StrCount    set    \1+1
  43.         endm
  44.  
  45. bp        equr    a5
  46.  
  47. gb_SysBase    equ       -0    ; L        ; destroys original A5 !!!!
  48. gb_DosBase    equ       -4    ; L
  49. gb_ReqBase    equ       -8    ; L
  50. gb_WbMsg    equ      -12    ; L
  51. gb_StdOut    equ      -16    ; L
  52. gb_PattCount    equ      -17    ; B
  53. gb_FlagLF    equ      -18    ; B
  54. gb_FlagReq    equ      -19    ; B
  55. gb_ArgC        equ      -20    ; B
  56. gb_ArgV        equ      -28    ; L*2
  57. gb_FileSize    equ      -32    ; L
  58. gb_FileBuf    equ      -36    ; L
  59. gb_ModSize    equ      -40    ; L
  60. gb_ModPtr    equ      -44    ; L
  61. gb_PtHeadSize    equ      -48    ; L
  62. gb_PtHeadBuf    equ      -52    ; L
  63. gb_FileReq    equ     -408    ; B*356
  64. gb_DirName    equ     -540    ; B*132
  65. gb_FileName    equ     -572    ; B*32
  66. gb_PrintBuf    equ     -736    ; B*164
  67. gb_SIZEOF    equ     -736
  68.  
  69. start        link    bp,#gb_SIZEOF        ; Platz fuer Vars schaffen
  70.  
  71.         move.l    d0,d2            ; Argumentlaenge sichern
  72.         move.l    a0,a2            ; Argumentzeile sichern
  73.  
  74.         move.l    #(~gb_SIZEOF>>2),d1
  75.         move.l    bp,a1
  76. .clear        clr.l    -(a1)            ; Variablenbereich loeschen
  77.         dbra    d1,.clear
  78.  
  79.         move.l    4.w,a6
  80.         move.l    a6,gb_SysBase(bp)    ; ExecBase sichern
  81.  
  82.         move.l    276(a6),a4        ; SysBase->ThisTask
  83.  
  84.         move.l    184(a4),d4        ; pr_WindowPtr
  85.         moveq    #-1,d0
  86.         move.l    d0,184(a4)        ; keine DOS-Requester
  87.  
  88.         tst.l    172(a4)
  89.         bne.s    fromCLI            ; CLI-Start
  90.  
  91. fromWB        lea    92(a4),a0
  92.         jsr    _LVOWaitPort(a6)
  93.         lea    92(a4),a0
  94.         jsr    _LVOGetMsg(a6)
  95.         move.l    d0,gb_WbMsg(bp)        ; WB-Message
  96.         bsr    OpenDOS
  97.         beq.s    exit2            ; kein DOS
  98.         move.l    gb_WbMsg(bp),a1
  99.         move.l    36(a1),a1
  100.         move.l    (a1),d1
  101.         move.l    gb_DosBase(bp),a6
  102.         jsr    _LVOCurrentDir(a6)    ; aktuelles Directory setzen
  103.         lea    ConName.str(pc),a1
  104.         move.l    a1,d1
  105.         move.l    #1005,d2        ; MODE_OLDFILE
  106.         jsr    _LVOOpen(a6)
  107.         move.l    d0,160(a4)        ; pr_COS -> Window Handle
  108.         beq.s    exit2            ; Fehler
  109.         bsr.s    main
  110.         moveq    #Return,d0        ; "Press RETURN !"
  111.         bsr    PrintStr
  112.         move.l    160(a4),d1        ; pr_COS
  113.         lea    gb_PrintBuf(bp),a0
  114.         move.l    a0,d2
  115.         moveq    #1,d3
  116.         move.l    gb_DosBase(bp),a6
  117.         jsr    _LVORead(a6)        ; ein Zeichen lesen
  118.         move.l    160(a4),d1
  119.         jsr    _LVOClose(a6)        ; Fenster schliessen
  120.         move.l    gb_SysBase(bp),a6
  121. exit2        jsr    _LVOForbid(a6)
  122.         move.l    gb_WbMsg(bp),a1
  123.         jsr    _LVOReplyMsg(a6)    ; WB-Message beantworten
  124.         bra.s    exit            ; zum Hauptprogramm
  125.  
  126. fromCLI        clr.b    -1(a2,d2.w)        ; Zeile terminieren
  127.         bsr.s    OpenDOS
  128.         beq.s    exit            ; kein DOS
  129.         move.l    a2,a1
  130.         lea    gb_ArgV(bp),a2
  131.         moveq    #0,d2
  132.         bsr    BuildArgV        ; Argument-Vektor aufbauen
  133.         move.b    d2,gb_ArgC(bp)        ; Argumentzahl sichern
  134.         bsr.s    main            ; Hauptprogramm
  135. exit        bsr.s    CloseDOS
  136.         move.l    d4,184(a4)        ; alten WindowPtr setzen
  137.         moveq    #0,d0            ; ReturnCode = Alles Ok
  138.         unlk    bp            ; Stack aufraeumen
  139.         rts
  140.  
  141. OpenDOS        lea    DosName(pc),a1        ; dos.library
  142.         moveq    #33,d0
  143.         jsr    _LVOOpenLibrary(a6)    ; DOS oeffen
  144.         move.l    d0,gb_DosBase(bp)    ; sichern -> Flags stellen
  145.         rts
  146.  
  147. CloseDOS    move.l    gb_DosBase(bp),d0    ; DOS geoeffnet ?
  148.         beq.s    .quit            ; nein
  149.         move.l    d0,a1
  150.         jsr    _LVOCloseLibrary(a6)    ; DOS schliessen
  151. .quit        rts
  152.  
  153. *****************************************************************************
  154.  
  155. main        move.l    a6,-(sp)        ; Reg sichern
  156.  
  157.         moveq    #PrgName,d0
  158.         bsr    PrintStr        ; Copyright ausgeben
  159.  
  160.         move.l    gb_ArgV(bp),a0        ; 1. Argument
  161.         move.b    gb_ArgC(bp),d0        ; Parameter ?
  162.         beq.s    m_request2        ; FileRequester bringen
  163.         subq.b    #2,d0
  164.         beq.s    m_request        ; In && Out || DirName sowie
  165.         cmp.b    #'?',(a0)
  166.         bne.s    m_request        ; kein Hilfeersuchen
  167. m_use        moveq    #Usage,d0
  168.         bsr    PrintStr        ; Usage ausgeben
  169.         bra.s    m_quit
  170.  
  171. m_request    move.b    (a0)+,d0        ; erstes Zeichen
  172.         rol.w    #8,d0
  173.         move.b    (a0)+,d0        ; zweites Zeichen
  174.         bset    #5,d0
  175.         cmp.w    #'-d',d0
  176.         bne.s    m_loop            ; kein Directory
  177.         tst.b    (a0)
  178.         bne.s    .onlyone        ; Name direkt angeschlossen
  179.         move.l    gb_ArgV+4(bp),d0
  180.         beq.s    m_use            ; Fehler -d ohne Argument !
  181.         move.l    d0,a0
  182. .onlyone    lea    gb_DirName(bp),a1
  183.         moveq    #127,d0
  184. .copy        move.b    (a0)+,(a1)+        ; DirName kopieren
  185.         dbeq    d0,.copy
  186. m_request2    lea    ReqLoad.str(pc),a0
  187.         bsr.s    ReqFile            ; File waehlen
  188.         bne.s    m_quit            ; Abbruch oder Fehler
  189.         st    gb_FlagReq(bp)
  190. m_loop        bsr    LoadFile        ; File laden
  191.         bne.s    m_cont2            ; Fehler !
  192.         bsr    DoMake            ; PT-Module aufbauen
  193.         bne.s    m_cont            ; Fehler !
  194.         tst.b    gb_FlagReq(bp)
  195.         beq.s    m_save
  196.         lea    ReqSave.str(pc),a0
  197.         bsr.s    ReqFile            ; File waehlen
  198.         bne.s    m_cont            ; Abbruch oder Fehler
  199. m_save        bsr    SaveFile        ; File speichern
  200. m_cont        move.l    gb_SysBase(bp),a6
  201.         move.l    gb_PtHeadBuf(bp),d0
  202.         beq.s    m_cont            ; kein Puffer da
  203.         move.l    d0,a1
  204.         move.l    gb_PtHeadSize(bp),d0    ; Puffergroesse
  205.         jsr    _LVOFreeMem(a6)
  206. m_cont2        move.l    gb_FileBuf(bp),d0
  207.         beq.s    m_quit            ; kein Puffer da
  208.         move.l    d0,a1
  209.         move.l    gb_FileSize(bp),d0    ; Puffergroesse
  210.         jsr    _LVOFreeMem(a6)        ; Puffer freigeben
  211. m_quit        move.l    (sp)+,a6        ; Reg zurueck
  212.         rts                ; Auf Wiedersehen !
  213.  
  214. *****************************************************************************
  215.  
  216. ReqFile        movem.l    d2/a2/a6,-(sp)        ; Regs sichern
  217.  
  218.         lea    gb_FileReq(bp),a2    ; File Requester
  219.         move.l    a0,2(a2)        ; Requester Titel eintragen
  220.         move.l    gb_ReqBase(bp),d0
  221.         bne.s    .is_open        ; Lib schon geöffnet !
  222.  
  223.         moveq    #ReqNeed,d2        ; REQ-Fehler
  224.         lea    ReqName(pc),a1
  225.         moveq    #0,d0            ; Lib Version
  226.         move.l    gb_SysBase(bp),a6
  227.         jsr    _LVOOpenLibrary(a6)    ; Lib oeffen
  228.         move.l    d0,gb_ReqBase(bp)
  229.         beq.s    .quit            ; kein REQ
  230.  
  231.         lea    gb_DirName(bp),a0
  232.         move.l    a0,6(a2)        ; DirName
  233.         lea    gb_FileName(bp),a0
  234.         move.l    a0,10(a2)        ; FileName
  235.         lea    gb_PrintBuf(bp),a0
  236.         move.l    a0,14(a2)        ; Path & File Name
  237.         move.w    #10,22(a2)        ; MaxExtSelect
  238.         move.l    #4116,30(a2)        ; Cache,IBut & Load
  239.         moveq    #2,d2
  240.         move.w    d2,34(a2)        ; DirNameColour
  241.         move.w    d2,38(a2)        ; DevNameColour
  242.  
  243. .is_open    moveq    #SelectErr,d2        ; REQ-Abbruch
  244.         move.l    a2,a0
  245.         move.l    d0,a6            ; d0 -> ReqBase !!!
  246.         jsr    _LVOFileRequest(a6)    ; Fragen wat nu ...
  247.         tst.l    d0
  248.         beq.s    .purge            ; nichts ausgewaehlt
  249. ;        move.b    #1,gb_ArgC(bp)        ; ein Argument
  250.         move.l    14(a2),gb_ArgV(bp)    ; load name
  251.         move.l    14(a2),gb_ArgV+4(bp)    ; save name
  252.         moveq    #0,d2            ; alles ok
  253.  
  254. .purge        move.l    d2,d0
  255.         bne.s    .purge_ok        ; Fehler aufgetreten
  256.         tst.b    gb_FlagReq(bp)
  257.         beq.s    .quit            ; Req noch nicht schliessen
  258.  
  259. .purge_ok    move.l    a2,a0            ; dem Request assoziierte
  260.         jsr    _LVOPurgeFiles(a6)    ; Speicherbereiche freigeben
  261.         move.l    a6,a1
  262.         move.l    gb_SysBase(bp),a6
  263.         jsr    _LVOCloseLibrary(a6)    ; REQ schliessen
  264.  
  265. .quit        move.l    d2,d0            ; Fehler aufgetreten
  266.         beq.s    .quit2
  267.         lea    ReqName(pc),a1
  268.         bsr    PrintStr        ; Meldung ausgeben
  269.         move.l    d2,d0            ; Flags wieder stellen
  270.  
  271. .quit2        movem.l    (sp)+,d2/a2/a6        ; Regs zurueck
  272.         rts
  273.  
  274. *****************************************************************************
  275.  
  276. LoadFile    movem.l    d2-7/a2/a6,-(sp)    ; Regs sichern
  277.  
  278.         move.l    gb_ArgV(bp),a0
  279.         bsr    ExtractRealName        ; Pfad und/oder Dir entfernen
  280.  
  281.         lea    gb_PrintBuf(bp),a2    ; hier jetzt voller DateiName
  282.         move.l    gb_DosBase(bp),a6
  283.  
  284.         moveq    #FileErr,d7        ; File-Fehler
  285.         move.l    a2,d1
  286.         move.l    #1005,d2
  287.         jsr    _LVOOpen(a6)        ; Datei öffnen
  288.         move.l    d0,d4
  289.         beq    .quit2            ; File nicht gefunden
  290.  
  291.         moveq    #ReadErr,d7        ; Lesefehler
  292.         move.l    d4,d1
  293.         move.l    a2,d2
  294.         moveq    #8,d3
  295.         jsr    _LVORead(a6)        ; erste 8 Bytes lesen
  296.         cmp.l    d0,d3
  297.         bne    .closef            ; Lesefehler
  298.         move.l    (a2),d6            ; erste 4 Bytes der Datei
  299.  
  300.         move.l    d4,d1
  301.         moveq    #-4,d2
  302.         moveq    #1,d3            ; OFFSET_END
  303.         jsr    _LVOSeek(a6)        ; zum Dateiende-4
  304.         tst.l    d0
  305.         bmi.s    .closef            ; Seekfehler
  306.  
  307.         move.l    d4,d1
  308.         move.l    a2,d2
  309.         moveq    #4,d3
  310.         jsr    _LVORead(a6)        ; 4 Bytes lesen
  311.         cmp.l    d0,d3
  312.         bne.s    .closef            ; Lesefehler
  313.  
  314.         move.l    d4,d1
  315.         moveq    #0,d2
  316.         moveq    #-1,d3            ; OFFSET_BEGINNING
  317.         jsr    _LVOSeek(a6)        ; zum Dateianfang
  318.         move.l    d0,d3            ; Wert sichern
  319.         bmi.s    .closef            ; Seekfehler
  320.         move.l    d3,gb_ModSize(bp)
  321.  
  322.         exg.l    d2,d6            ; Null nach D6
  323.         cmp.l    #'PP20',d2        ; PowerPacked ?
  324.         bne.s    .notpp
  325.         move.l    (a2),d6            ; richtige Laenge
  326.         lsr.l    #8,d6            ; extrahieren
  327.         move.l    d6,gb_ModSize(bp)
  328.         moveq    #16,d0            ; 16 Bytes als
  329.         add.l    d0,d6            ; Sicherheit dazu
  330. .notpp        exg.l    d3,d6
  331.         tst.l    d3
  332.         bne.s    .ok            ; D6 <> 0 -> gepacket !
  333.         exg.l    d3,d6            ; Abstand zurueck nach d0
  334.         bsr.s    ModCheck        ; Modul prüfen
  335.         bne.s    .closef            ; nein
  336. .ok        move.l    d3,gb_FileSize(bp)    ; Puffergroesse
  337.  
  338.         moveq    #MemErr,d7        ; Speicher-Fehler        
  339.         move.l    d3,d0            ; Speichergroesse
  340.         moveq    #1,d1
  341.         move.l    gb_SysBase(bp),a6
  342.         jsr    _LVOAllocMem(a6)    ; Puffer allokieren
  343.         move.l    gb_DosBase(bp),a6
  344.         move.l    d0,gb_FileBuf(bp)
  345.         beq.s    .closef            ; kein Speicher
  346.         move.l    d0,gb_ModPtr(bp)    ; if PP -> FileBuf != ModPtr !
  347.  
  348.         moveq    #ReadErr,d7        ; Lese-Fehler
  349.         move.l    d4,d1
  350.         move.l    gb_FileBuf(bp),d2
  351.         tst.l    d6            ; gepackte Laenge != 0 ?
  352.         beq.s    .read
  353.         move.l    d6,d3            ; powerpacked
  354. .read        jsr    _LVORead(a6)        ; Header & Pattern einlesen
  355.         cmp.l    d0,d3
  356.         bne.s    .closef            ; Lesefehler
  357.         moveq    #0,d7            ; kein Fehler
  358.  
  359. .closef        move.l    d4,d1
  360.         jsr    _LVOClose(a6)        ; File schliessen
  361.  
  362. .quitt        tst.l    d6            ; gepackt ?
  363.         beq.s    .quit2
  364.         move.l    gb_FileBuf(bp),a1    ; DeCrunch Puffer
  365.         lea    0(a1,d6.l),a0        ; EndCrunch
  366.         lea    16(a1),a1
  367.         move.l    a1,gb_ModPtr(bp)    ; richtiger Module-Ptr
  368.         addq.l    #4,a2            ; DeCrunch-Bits
  369.         bsr    PPDeCrunch        ; auspacken
  370.         move.l    (a1),d2
  371.         bsr.s    ModCheck        ; prüfen
  372.  
  373. .quit2        move.l    d7,d0            ; alles ok ?
  374.         beq.s    .quit3            ; ja
  375.         lea    gb_FileName(bp),a1    ; FileName
  376.         bsr    PrintStr        ; Fehler-Meldung ausgeben
  377.         move.l    d7,d0            ; Fehler-Nr zurueckgeben
  378.  
  379. .quit3        movem.l    (sp)+,d2-7/a2/a6    ; Regs zurueck
  380.         rts
  381.  
  382. ModCheck    moveq    #0,d7
  383.         cmp.l    #'SNT!',d2        ; Kennung
  384.         beq.s    .quit
  385.         moveq    #ModErr,d7
  386. .quit        rts
  387.  
  388. *****************************************************************************
  389.  
  390. ExtractRealName    lea    gb_PrintBuf(bp),a1    ; open buffer
  391.         move.w    #163,d0
  392. .copy1        move.b    (a0)+,(a1)+        ; copy argument
  393.         dbeq    d0,.copy1
  394.         lea    gb_PrintBuf(bp),a0    ; string to parse
  395.         move.l    a0,a1
  396.         moveq    #-1,d1
  397. .strlen        tst.b    (a1)+            ; look for string end
  398.         dbeq    d1,.strlen
  399.         not.l    d1            ; string len of filename
  400. .search1    move.b    (a0,d1.w),d0        ; search for "/" && ":" to
  401.         cmp.b    #'/',d0
  402.         beq.s    .next1            ; eliminate path and/or
  403.         cmp.b    #':',d0
  404. .next1        dbeq    d1,.search1        ; dir from file name
  405.         lea    1(a0,d1.w),a0        ; start of real name
  406.         lea    gb_FileName(bp),a1    ; real name buffer
  407.         moveq    #29,d0
  408. .copy2        move.b    (a0)+,(a1)+        ; copy name
  409.         dbeq    d0,.copy2
  410.         lea    gb_FileName(bp),a1    ; check the filename
  411. .search2    move.b    (a1)+,d1
  412.         beq.s    .ok            ; for '.pp' extension
  413.         cmp.b    #'.',d1
  414.         bne.s    .search2
  415.         move.b    (a1),d1            ; if this extension is
  416.         rol.w    #8,d1
  417.         move.b    1(a1),d1
  418.         or.w    #$2020,d1        ; found then remove
  419.         cmp.w    #'pp',d1
  420.         bne.s    .search2
  421.         tst.b    2(a1)            ; string end ?
  422.         bne.s    .search2
  423.         clr.b    -1(a1)            ; it !
  424. .ok        rts
  425.  
  426. *****************************************************************************
  427.  
  428. SaveFile    movem.l    d2-5/a6,-(sp)        ; save regs
  429.  
  430.         move.l    gb_ArgV+4(bp),d0    ; second argument ?
  431.         bne.s    .is_name
  432.         move.l    gb_ArgV(bp),d0        ; use first argument
  433. .is_name    move.l    d0,a0
  434.         bsr.s    ExtractRealName        ; remove path and/or dir
  435.  
  436.         move.l    gb_DosBase(bp),a6
  437.  
  438.         moveq    #FileErr,d5
  439.         lea    gb_PrintBuf(bp),a1    ; here is the full filename
  440.         move.l    a1,d1
  441.         move.l    #1006,d2        ; MODE_NEWFILE
  442.         jsr    _LVOOpen(a6)
  443.         move.l    d0,d4
  444.         beq.s    .quit            ; open error
  445.  
  446.         moveq    #WriteErr,d5
  447.         move.l    d4,d1
  448.         move.l    gb_PtHeadBuf(bp),d2    ; pt header
  449.         move.l    gb_PtHeadSize(bp),d3    ; header size
  450.         jsr    _LVOWrite(a6)
  451.         cmp.l    d3,d0
  452.         bne.s    .closef            ; write error
  453.  
  454.         move.l    d4,d1
  455.         move.l    gb_ModPtr(bp),a0
  456.         move.l    a0,d2
  457.         add.l    4(a0),d2        ; sample start
  458.         move.l    a0,d3
  459.         add.l    gb_ModSize(bp),d3
  460.         sub.l    d2,d3            ; sample length
  461.         jsr    _LVOWrite(a6)
  462.         cmp.l    d3,d0
  463.         bne.s    .closef            ; write error
  464.         moveq    #0,d5            ; all ok
  465.  
  466. .closef        move.l    d4,d1
  467.         jsr    _LVOClose(a6)        ; close file
  468.         move.l    d5,d0
  469.         beq.s    .quit
  470. .delfile    lea    gb_PrintBuf(bp),a1
  471.         move.l    a1,d1
  472.         jsr    _LVODeleteFile(a6)    ; remove faulty file
  473.         
  474. .quit        move.l    d5,d0            ; error ?
  475.         bne.s    .msg
  476.         moveq    #Success,d0        ; end message
  477. .msg        lea    gb_FileName(bp),a1
  478.         bsr    PrintStr        ; print err message
  479.         move.l    d5,d0
  480.  
  481. .quit2        movem.l    (sp)+,d2-5/a6        ; restore regs
  482.         rts
  483.  
  484. *****************************************************************************
  485.  
  486. DoMake        movem.l    d2/a6,-(sp)        ; save regs
  487.         moveq    #0,d0
  488.         moveq    #0,d1
  489.         move.l    gb_ModPtr(bp),a1
  490.         lea    $102(a1),a1        ; start of pattern list
  491.         moveq    #127,d2            ; 128 entrys
  492. .look        move.b    (a1)+,d1
  493.         cmp.b    d0,d1
  494.         bcs.s    .next
  495.         move.b    d1,d0
  496. .next        dbra    d2,.look
  497.         move.b    d0,gb_PattCount(bp)    ; highest pattern in file
  498.         addq.w    #1,d0
  499.         lsl.l    #8,d0
  500.         lsl.l    #2,d0            ; pattcount*1024
  501.         add.l    #$43c,d0        ; add header size
  502.         move.l    d0,gb_PtHeadSize(bp)
  503.         moveq    #1,d1
  504.         swap    d1
  505.         move.l    gb_SysBase(bp),a6
  506.         jsr    _LVOAllocMem(a6)
  507.         moveq    #MemErr,d2
  508.         move.l    d0,gb_PtHeadBuf(bp)
  509.         beq.s    .quit            ; no buffer
  510.  
  511.         moveq    #InfoPR,d0        ; ProRunner Info
  512.         lea    gb_FileName(bp),a1
  513.         bsr.s    PrintStr        ; Name
  514.         moveq    #InfoFS,d0
  515.         move.l    gb_ModSize(bp),a1
  516.         bsr.s    PrintStr        ; Size
  517.  
  518.         bsr    BuildHeader        ; build pt header
  519.         bsr    MakePattern        ; construct pattern
  520.  
  521.         moveq    #InfoPT,d0        ; ProTracker Info
  522.         lea    gb_FileName(bp),a1
  523.         bsr.s    PrintStr        ; Name
  524.         moveq    #InfoFS,d0
  525.         move.l    gb_ModPtr(bp),a0    ; calculate sample length
  526.         move.l    gb_ModSize(bp),a1
  527.         sub.l    4(a0),a1
  528.         add.l    gb_PtHeadSize(bp),a1
  529.         bsr.s    PrintStr        ; Size
  530.         st    gb_FlagLF(bp)        ; naechstes PrintStr, erst LF
  531.         moveq    #0,d2            ; all ok
  532.  
  533. .quit        move.l    d2,d0
  534.         beq.s    .quit2
  535.         bsr.s    PrintStr        ; error message
  536.         move.l    d2,d0
  537. .quit2        movem.l    (sp)+,d2/a6        ; restore regs
  538.         rts
  539.  
  540. *****************************************************************************
  541.  
  542. PrintStr    movem.l    d2-3/a1-3/a6,-(sp)    ; save regs
  543.         move.l    d0,d2
  544.         tst.b    gb_FlagLF(bp)
  545.         beq.s    .nolf
  546.         clr.b    gb_FlagLF(bp)
  547.         moveq    #LineFeed,d0
  548.         bsr.s    PrintStr
  549. .nolf        lea    StringTab(pc),a0    ; start of string table
  550.         add.w    d2,d2
  551.         add.w    0(a0,d2.w),a0        ; add offset
  552.         move.l    a1,-(sp)
  553.         move.l    sp,a1            ; pointer to argument
  554.         lea    sc_put(pc),a2        ; buffer function
  555.         lea    gb_PrintBuf(bp),a3    ; output buffer
  556.         move.l    gb_SysBase(bp),a6
  557.         jsr    _LVORawDoFmt(a6)    ; do the format
  558.         addq.l    #4,sp            ; adjust stack
  559.         move.l    gb_DosBase(bp),a6
  560.         jsr    _LVOOutput(a6)
  561.         lea    gb_PrintBuf(bp),a0
  562.         move.l    a0,d2            ; output buffer
  563.         moveq    #-1,d3
  564. .size        tst.b    (a0)+
  565.         dbeq    d3,.size
  566.         not.l    d3            ; output lenght
  567.         jsr    _LVOWrite(a6)
  568.         movem.l    (sp)+,d2-3/a1-3/a6    ; restore regs
  569.         rts
  570.  
  571. sc_put        move.b    d0,(a3)+        ; store char in buffer
  572.         rts
  573.  
  574. *****************************************************************************
  575.  
  576. BuildHeader    lea    gb_FileName(bp),a0    ; name without path && dir
  577.         move.l    gb_PtHeadBuf(bp),a1
  578.         moveq    #19,d0
  579. .copy1        move.b    (a0)+,(a1)+        ; copy name to pt mod
  580.         dbeq    d0,.copy1
  581.         move.l    gb_ModPtr(bp),a0    ; ProRun Mod
  582.         addq.l    #8,a0
  583.         move.l    gb_PtHeadBuf(bp),a1    ; ProTr Mod
  584.         lea    20(a1),a1
  585.         moveq    #30,d0            ; copy 31 sample infos
  586. .copy2        lea    22(a1),a1
  587.         move.l    (a0)+,(a1)+        ; lenght, fintune & volume
  588.         move.l    (a0)+,(a1)+        ; repstart, replength
  589.         dbra    d0,.copy2
  590.         moveq    #31,d0
  591. .copy3        move.l    (a0)+,(a1)+        ; copy pattern list
  592.         dbra    d0,.copy3
  593.         move.w    (a0)+,(a1)+
  594.         move.l    #'M.K.',(a1)        ; store pt sign
  595.         rts
  596.  
  597. MakePattern    movem.l    d2-6/a2-3,-(sp)        ; save regs
  598.         moveq    #12,d3
  599.         move.l    gb_ModPtr(bp),a0
  600.         lea    $302(a0),a0        ; pattern start prorun
  601.         move.l    gb_PtHeadBuf(bp),a1
  602.         lea    $43c(a1),a1        ; pattern start protr
  603.         lea    pt_periods(pc),a2
  604.         lea    gb_PrintBuf(bp),a3    ; temp note buffer
  605.         moveq    #0,d6
  606.         move.b    gb_PattCount(bp),d6
  607. nextpatt    move.w    #255,d5            ; 256 notes
  608. nextnote    moveq    #0,d0
  609.         move.b    (a0)+,d0        ; pos+0
  610. .fall3        move.l    0(a3,d3.w),d1
  611.         cmp.b    #$c0,d0            ; previous channel note ?
  612.         beq.s    savenote
  613. .fall2        moveq    #0,d1
  614.         cmp.b    #$80,d0            ; blank note ?
  615.         beq.s    savenote
  616. .fall1        move.b    (a0)+,d1        ; pos+1
  617.         moveq    #$0f,d2
  618.         and.b    d1,d2            ; extract effect number
  619.         lsr.b    #4,d1            ; sample nr lower nibble
  620.         add.b    d1,d1            ; sample nr * 2
  621.         moveq    #1,d4            ; adjust value
  622.         and.b    d0,d4            ; check bit zero
  623.         add.b    d4,d1            ; adjust sample nr
  624.         sub.b    d4,d0            ; adjust note offset
  625.         beq.s    .no_per            ; period == 0
  626.         move.w    -2(a2,d0.w),d0        ; get period
  627. .no_per        swap    d1
  628.         lsr.l    #4,d1            ; divide sample nr
  629.         lsl.w    #8,d2            ; enable effect parameter
  630.         move.b    (a0)+,d2        ; pos+2
  631.         or.w    d2,d1            ; make lower part
  632.         swap    d1
  633.         ror.w    #4,d1            ; move upper sample nr bits
  634.         or.w    d0,d1            ; make upper part
  635.         swap    d1            
  636. savenote    move.l    d1,(a1)+        ; store full note
  637.         beq.s    .no_note
  638.         move.l    d1,0(a3,d3.w)        ; save new channel note
  639. .no_note    subq.w    #4,d3
  640.         bcc.s    .next
  641.         moveq    #12,d3    
  642. .next        dbra    d5,nextnote        ; next note
  643.         dbra    d6,nextpatt        ; next pattern
  644.         movem.l    (sp)+,d2-6/a2-3        ; restore regs
  645.         rts
  646.  
  647. *****************************************************************************
  648.  
  649. ; a1 - pointer into command line
  650. ; d2 - argc
  651. ; a2 - argv
  652.  
  653. BuildArgV    bsr.s    GetNext            ; search argument
  654.         bmi.s    doquote            ; quotation sign
  655.         beq.s    dosemi            ; commentary stops all
  656.         bcs.s    BuildArgV        ; separation sign
  657.         lea    -1(a1),a0        ; argument start
  658.         bsr.s    BumpArgV        ; argc+1 & ptr to argv
  659. build_2        bsr.s    GetNext            ; search separation sign
  660.         beq.s    dosemi            ; commentary stops all
  661.         bcc.s    build_2            ; no separation sign
  662.         clr.b    -1(a1)            ; mark end
  663.         bra.s    BuildArgV        ; continue search
  664.  
  665. doquote        move.l    a1,a0            ; argument start
  666.         bsr.s    BumpArgV        ; argc+1 & ptr to argv
  667. quote_2        bsr.s    GetNext            ; search quotation sign
  668.         bpl.s    quote_2            ; no quotation sign
  669.         clr.b    -1(a1)            ; mark end
  670. quote_3        bsr.s    GetNext            ; search sepaartion sign
  671.         beq.s    dosemi            ; commentary stops all
  672.         bcc.s    quote_3            ; no separation sign
  673.         bra.s    BuildArgV        ; continue search
  674.  
  675. dosemi        clr.b    -(a1)            ; delete semicolon
  676.         bra.s    BuildArgV        ; go on
  677.  
  678. BumpArgV    cmp.w    #2,d2            ; max argc reached ?
  679.         bcc.s    .full
  680.         move.l    a0,(a2)+        ; store argptr
  681.         addq.w    #1,d2            ; increment argc
  682. .full        rts
  683.  
  684. GetNext        move.b    (a1)+,d0        ; test character
  685.         beq.s    BuildRdy
  686.         moveq    #-3,d1            ; N=1,Z=0,C=0 -> quotation
  687.         cmp.b    #'"',d0
  688.         beq.s    .quit
  689.         moveq    #-2,d1            ; N=0,Z=1,C=1 -> semicolon
  690.         cmp.b    #';',d0
  691.         beq.s    .quit
  692.         moveq    #-1,d1            ; N=0,Z=0,C=1 -> separation
  693.         cmp.b    #'=',d0
  694.         beq.s    .quit
  695.         cmp.b    #' ',d0
  696.         beq.s    .quit
  697.         cmp.b    #9,d0
  698.         beq.s    .quit
  699.         moveq    #0,d1            ; N=0,Z=0,C=0 -> others
  700. .quit        addq.l    #2,d1            ; set flags ( see above )
  701.         rts
  702.  
  703. BuildRdy    addq.l    #4,sp            ; set right return address
  704.         rts
  705.  
  706. *****************************************************************************
  707.  
  708. ; PowerPacker assembler decrunch-subroutine
  709. ;
  710. ; PPDecrunch (endcrun, buffer, efficiency);
  711. ;               a0       a1        a2
  712.  
  713. PPDeCrunch    movem.l    d0-7/a0-5,-(sp)
  714.         moveq    #0,d4
  715.         moveq    #1,d5
  716.         moveq    #24,d6
  717.         move.w    #255,d7
  718.         movea.l    a1,a3
  719.         lea    myDecrTab(pc),a4
  720.         lea    $dff1a2,a5        ; DeCrunch Effect
  721.         move.l    -(a0),d1
  722.         tst.b    d1
  723.         beq.s    ppdecr_02
  724.         lsr.l    #1,d5
  725.         beq.s    ppdecr_10
  726. ppdecr_01    subq.b    #1,d1
  727.         lsr.l    d1,d5
  728. ppdecr_02    lsr.l    #8,d1
  729.         adda.l    d1,a1
  730. ppdecr_03    lsr.l    #1,d5
  731.         beq.s    ppdecr_11
  732. ppdecr_04    bcs    ppdecr_21
  733.         moveq    #0,d2
  734. ppdecr_05    moveq    #0,d1
  735.         lsr.l    #1,d5
  736.         beq.s    ppdecr_12
  737. ppdecr_06    roxl.w    #1,d1
  738.         lsr.l    #1,d5
  739.         beq.s    ppdecr_13
  740. ppdecr_07    roxl.w    #1,d1
  741.         add.w    d1,d2
  742.         subq.w    #3,d1
  743.         beq.s    ppdecr_05
  744.         moveq    #0,d0
  745. ppdecr_08    move.b    d5,d4
  746.         lsr.l    #8,d5
  747.         beq.s    ppdecr_16
  748. ppdecr_09    move.b    -128(a4,d4.w),d0
  749.         move.b    d0,-(a1)
  750.         dbra    d2,ppdecr_08
  751.         move.w    a1,(a5)
  752.         cmpa.l    a1,a3
  753.         bcs.s    ppdecr_21
  754.         bra    ppdecr_52
  755.  
  756. ppdecr_10    move.l    -(a0),d5
  757.         roxr.l    #1,d5
  758.         bra.s    ppdecr_01
  759.  
  760. ppdecr_11    move.l    -(a0),d5
  761.         roxr.l    #1,d5
  762.         bra.s    ppdecr_04
  763.  
  764. ppdecr_12    move.l    -(a0),d5
  765.         roxr.l    #1,d5
  766.         bra.s    ppdecr_06
  767.  
  768. ppdecr_13    move.l    -(a0),d5
  769.         roxr.l    #1,d5
  770.         bra.s    ppdecr_07
  771.  
  772. ppdecr_14    move.l    -(a0),d5
  773.         roxr.l    #1,d5
  774.         bra.s    ppdecr_22
  775.  
  776. ppdecr_15    move.l    -(a0),d5
  777.         roxr.l    #1,d5
  778.         bra.s    ppdecr_23
  779.  
  780. ppdecr_16    move.b    127(a4,d4.w),d0
  781.         move.l    -(a0),d5
  782.         move.w    d5,d3
  783.         lsl.w    d0,d3
  784.         bchg    d0,d3
  785.         eor.w    d3,d4
  786.         and.w    d7,d4
  787.         moveq    #8,d1
  788.         sub.w    d0,d1
  789.         lsr.l    d1,d5
  790.         add.w    d6,d0
  791.         bset    d0,d5
  792.         bra.s    ppdecr_09
  793.  
  794. ppdecr_17    move.b    127(a4,d4.w),d0
  795.         move.l    -(a0),d5
  796.         move.w    d5,d3
  797.         lsl.w    d0,d3
  798.         bchg    d0,d3
  799.         eor.w    d3,d4
  800.         and.w    d7,d4
  801.         moveq    #8,d1
  802.         sub.w    d0,d1
  803.         lsr.l    d1,d5
  804.         add.w    d6,d0
  805.         bset    d0,d5
  806.         bra.s    ppdecr_24
  807.  
  808. ppdecr_18    move.l    -(a0),d5
  809.         roxr.l    #1,d5
  810.         bra.s    ppdecr_30
  811.  
  812. ppdecr_19    move.l    -(a0),d5
  813.         roxr.l    #1,d5
  814.         bra.s    ppdecr_31
  815.  
  816. ppdecr_20    move.l    -(a0),d5
  817.         roxr.l    #1,d5
  818.         bra.s    ppdecr_32
  819.  
  820. ppdecr_21    moveq    #0,d2
  821.         lsr.l    #1,d5
  822.         beq.s    ppdecr_14
  823. ppdecr_22    roxl.w    #1,d2
  824.         lsr.l    #1,d5
  825.         beq.s    ppdecr_15
  826. ppdecr_23    roxl.w    #1,d2
  827.         move.b    d5,d4
  828.         lsr.l    #8,d5
  829.         beq.s    ppdecr_17
  830. ppdecr_24    moveq    #0,d3
  831.         move.b    -128(a4,d4.w),d3
  832.         cmp.w    #3,d2
  833.         bne.s    ppdecr_43
  834.         bclr    #7,d3
  835.         beq.s    ppdecr_36
  836.         moveq    #13,d0
  837.         sub.b    0(a2,d2.w),d0
  838.         move.w    d0,d1
  839.         add.w    d0,d0
  840.         add.w    d1,d0
  841.         add.w    d0,d0
  842.         jmp    ppdecr_28(pc,d0.w)
  843.  
  844. ppdecr_25    move.l    -(a0),d5
  845.         roxr.l    #1,d5
  846.         bra.s    ppdecr_33
  847.  
  848. ppdecr_26    move.l    -(a0),d5
  849.         roxr.l    #1,d5
  850.         bra.s    ppdecr_34
  851.  
  852. ppdecr_27    move.l    -(a0),d5
  853.         roxr.l    #1,d5
  854.         bra.s    ppdecr_35
  855.  
  856. ppdecr_28    lsr.l    #1,d5
  857.         beq.s    ppdecr_18
  858. ppdecr_30    roxl.w    #1,d3
  859.         lsr.l    #1,d5
  860.         beq.s    ppdecr_19
  861. ppdecr_31    roxl.w    #1,d3
  862.         lsr.l    #1,d5
  863.         beq.s    ppdecr_20
  864. ppdecr_32    roxl.w    #1,d3
  865.         lsr.l    #1,d5
  866.         beq.s    ppdecr_25
  867. ppdecr_33    roxl.w    #1,d3
  868.         lsr.l    #1,d5
  869.         beq.s    ppdecr_26
  870. ppdecr_34    roxl.w    #1,d3
  871.         lsr.l    #1,d5
  872.         beq.s    ppdecr_27
  873. ppdecr_35    roxl.w    #1,d3
  874. ppdecr_36    moveq    #0,d1
  875.         lsr.l    #1,d5
  876.         beq.s    ppdecr_40
  877. ppdecr_37    roxl.w    #1,d1
  878.         lsr.l    #1,d5
  879.         beq.s    ppdecr_41
  880. ppdecr_38    roxl.w    #1,d1
  881.         lsr.l    #1,d5
  882.         beq.s    ppdecr_42
  883. ppdecr_39    roxl.w    #1,d1
  884.         add.w    d1,d2
  885.         subq.w    #7,d1
  886.         beq.s    ppdecr_36
  887.         bra.s    ppdecr_50
  888.  
  889. ppdecr_40    move.l    -(a0),d5
  890.         roxr.l    #1,d5
  891.         bra.s    ppdecr_37
  892.  
  893. ppdecr_41    move.l    -(a0),d5
  894.         roxr.l    #1,d5
  895.         bra.s    ppdecr_38
  896.  
  897. ppdecr_42    move.l    -(a0),d5
  898.         roxr.l    #1,d5
  899.         bra.s    ppdecr_39
  900.  
  901. ppdecr_43    moveq    #13,d0
  902.         sub.b    0(a2,d2.w),d0
  903.         move.w    d0,d1
  904.         add.w    d0,d0
  905.         add.w    d1,d0
  906.         add.w    d0,d0
  907.         jmp    ppdecr_44(pc,d0.w)
  908.  
  909. ppdecr_44    lsr.l    #1,d5
  910.         beq.s    ppdecr_53
  911. ppdecr_45    roxl.w    #1,d3
  912.         lsr.l    #1,d5
  913.         beq.s    ppdecr_54
  914. ppdecr_46    roxl.w    #1,d3
  915.         lsr.l    #1,d5
  916.         beq.s    ppdecr_55
  917. ppdecr_47    roxl.w    #1,d3
  918.         lsr.l    #1,d5
  919.         beq.s    ppdecr_56
  920. ppdecr_48    roxl.w    #1,d3
  921.         lsr.l    #1,d5
  922.         beq.s    ppdecr_57
  923. ppdecr_49    roxl.w    #1,d3
  924. ppdecr_50    move.b    0(a1,d3.w),-(a1)
  925. ppdecr_51    move.b    0(a1,d3.w),-(a1)
  926.         dbra    d2,ppdecr_51
  927.         move.w    a1,(a5)
  928.         cmpa.l    a1,a3
  929.         bcs    ppdecr_03
  930. ppdecr_52    movem.l    (sp)+,d0-7/a0-5
  931.         rts
  932.  
  933. ppdecr_53    move.l    -(a0),d5
  934.         roxr.l    #1,d5
  935.         bra.s    ppdecr_45
  936.  
  937. ppdecr_54    move.l    -(a0),d5
  938.         roxr.l    #1,d5
  939.         bra.s    ppdecr_46
  940.  
  941. ppdecr_55    move.l    -(a0),d5
  942.         roxr.l    #1,d5
  943.         bra.s    ppdecr_47
  944.  
  945. ppdecr_56    move.l    -(a0),d5
  946.         roxr.l    #1,d5
  947.         bra.s    ppdecr_48
  948.  
  949. ppdecr_57    move.l    -(a0),d5
  950.         roxr.l    #1,d5
  951.         bra.s    ppdecr_49
  952.  
  953.         dc.b    $00,$80,$40,$C0,$20,$A0,$60,$E0
  954.         dc.b    $10,$90,$50,$D0,$30,$B0,$70,$F0
  955.         dc.b    $08,$88,$48,$C8,$28,$A8,$68,$E8
  956.         dc.b    $18,$98,$58,$D8,$38,$B8,$78,$F8
  957.         dc.b    $04,$84,$44,$C4,$24,$A4,$64,$E4
  958.         dc.b    $14,$94,$54,$D4,$34,$B4,$74,$F4
  959.         dc.b    $0C,$8C,$4C,$CC,$2C,$AC,$6C,$EC
  960.         dc.b    $1C,$9C,$5C,$DC,$3C,$BC,$7C,$FC
  961.         dc.b    $02,$82,$42,$C2,$22,$A2,$62,$E2
  962.         dc.b    $12,$92,$52,$D2,$32,$B2,$72,$F2
  963.         dc.b    $0A,$8A,$4A,$CA,$2A,$AA,$6A,$EA
  964.         dc.b    $1A,$9A,$5A,$DA,$3A,$BA,$7A,$FA
  965.         dc.b    $06,$86,$46,$C6,$26,$A6,$66,$E6
  966.         dc.b    $16,$96,$56,$D6,$36,$B6,$76,$F6
  967.         dc.b    $0E,$8E,$4E,$CE,$2E,$AE,$6E,$EE
  968.         dc.b    $1E,$9E,$5E,$DE,$3E,$BE,$7E,$FE
  969. myDecrTab    dc.b    $01,$81,$41,$C1,$21,$A1,$61,$E1
  970.         dc.b    $11,$91,$51,$D1,$31,$B1,$71,$F1
  971.         dc.b    $09,$89,$49,$C9,$29,$A9,$69,$E9
  972.         dc.b    $19,$99,$59,$D9,$39,$B9,$79,$F9
  973.         dc.b    $05,$85,$45,$C5,$25,$A5,$65,$E5
  974.         dc.b    $15,$95,$55,$D5,$35,$B5,$75,$F5
  975.         dc.b    $0D,$8D,$4D,$CD,$2D,$AD,$6D,$ED
  976.         dc.b    $1D,$9D,$5D,$DD,$3D,$BD,$7D,$FD
  977.         dc.b    $03,$83,$43,$C3,$23,$A3,$63,$E3
  978.         dc.b    $13,$93,$53,$D3,$33,$B3,$73,$F3
  979.         dc.b    $0B,$8B,$4B,$CB,$2B,$AB,$6B,$EB
  980.         dc.b    $1B,$9B,$5B,$DB,$3B,$BB,$7B,$FB
  981.         dc.b    $07,$87,$47,$C7,$27,$A7,$67,$E7
  982.         dc.b    $17,$97,$57,$D7,$37,$B7,$77,$F7
  983.         dc.b    $0F,$8F,$4F,$CF,$2F,$AF,$6F,$EF
  984.         dc.b    $1F,$9F,$5F,$DF,$3F,$BF,$7F,$FF
  985.         dc.b    $00,$01,$01,$02,$02,$02,$02,$03
  986.         dc.b    $03,$03,$03,$03,$03,$03,$03,$04
  987.         dc.b    $04,$04,$04,$04,$04,$04,$04,$04
  988.         dc.b    $04,$04,$04,$04,$04,$04,$04,$05
  989.         dc.b    $05,$05,$05,$05,$05,$05,$05,$05
  990.         dc.b    $05,$05,$05,$05,$05,$05,$05,$05
  991.         dc.b    $05,$05,$05,$05,$05,$05,$05,$05
  992.         dc.b    $05,$05,$05,$05,$05,$05,$05,$06
  993.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  994.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  995.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  996.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  997.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  998.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  999.         dc.b    $06,$06,$06,$06,$06,$06,$06,$06
  1000.         dc.b    $06,$06,$06,$06,$06,$06,$06,$07
  1001.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1002.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1003.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1004.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1005.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1006.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1007.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1008.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1009.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1010.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1011.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1012.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1013.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1014.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1015.         dc.b    $07,$07,$07,$07,$07,$07,$07,$07
  1016.         dc.b    $07,$07,$07,$07,$07,$07,$07,$00
  1017.  
  1018. *****************************************************************************
  1019.  
  1020. pt_periods    dc.w    856,808,762,720,678,640,604,570,538
  1021.         dc.w    508,480,453,428,404,381,360,339,320
  1022.         dc.w    302,285,269,254,240,226,214,202,190
  1023.         dc.w    180,170,160,151,143,135,127,120,113
  1024.  
  1025. StrCount    set    0
  1026.  
  1027. StringTab    ADDSTR    PrgName
  1028.         ADDSTR    Usage
  1029.         ADDSTR    FileErr
  1030.         ADDSTR    ReadErr
  1031.         ADDSTR    WriteErr
  1032.         ADDSTR    ModErr
  1033.         ADDSTR    MemErr
  1034.         ADDSTR    ReqNeed
  1035.         ADDSTR    SelectErr
  1036.         ADDSTR    InfoPR
  1037.         ADDSTR    InfoPT
  1038.         ADDSTR    InfoFS
  1039.         ADDSTR    LineFeed
  1040.         ADDSTR    Success
  1041.         ADDSTR    Return
  1042.  
  1043. PrgName.str    dc.b    $9B,'3;33mProRunCrack 1.0',$9b,'0m © 1993'
  1044.         dc.b    ' by Gunther Nikl',10,10,0
  1045.         even
  1046. Usage.str    dc.b    $9B,'1;31mUsage:',$9b,'0m ProRunCrack '
  1047.         dc.b    '[ InFile ] [ OutFile ]',10
  1048.         dc.b    '         or',10,'       ProRunCrack '
  1049.         dc.b    '[ -d DirectoryName ]',10,0
  1050.         even
  1051. FileErr.str    dc.b    '%s - open error !',10,0
  1052.         even
  1053. ReadErr.str    dc.b    '%s - read error !',10,0
  1054.         even
  1055. WriteErr.str    dc.b    '%s - write error !',10,0
  1056.         even
  1057. ModErr.str    dc.b    '%s - not a prorunner 2.0 module !',10,0
  1058.         even
  1059. MemErr.str    dc.b    'not enough memory !',10,0
  1060.         even
  1061. ReqNeed.str    dc.b    'no %s for filerequest !',10,0
  1062.         even
  1063. SelectErr.str    dc.b    'requester canceled !',10,0
  1064.         even
  1065. InfoPR.str    dc.b    'ProRunner  : %s',0
  1066.         even
  1067. InfoPT.str    dc.b    'ProTracker : %s',0
  1068.         even
  1069. InfoFS.str    dc.b    ' -> %6ld Bytes'
  1070. LineFeed.str    dc.b    10,0
  1071.         even
  1072. Success.str    dc.b    'done.',10,0
  1073.         even
  1074. Return.str    dc.b    10,$9B,'0 p',$9B,'3;31mANY KEY TO QUIT !',$9b,'0m',0
  1075.         even
  1076.  
  1077. ReqLoad.str    dc.b    'Load ProRunner File ...',0
  1078.         even
  1079. ReqSave.str    dc.b    'Save ProTracker File to ...',0
  1080.         even
  1081.  
  1082. ConName.str    dc.b    'RAW:0/20/640/100/ProRunCrack 1.0',0
  1083.         even
  1084.  
  1085. DosName        dc.b    'dos.library',0
  1086.         even
  1087. ReqName        dc.b    'req.library',0
  1088.         even
  1089.  
  1090.